package gsw.tool.json.serializer;

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import gsw.tool.json.JsonConfig;
import gsw.tool.json.Utils;

/**
 * 专门负责对一个javaBean对象进行序列化
 */
public class JavaBeanSerializer implements ObjectSerializer {

    //需要序列化的成员
    private final List<FieldSerializer> fieldSerializers;

    public JavaBeanSerializer(Class<?> beanType) {
        //属性集合
        Map<String, Field> fieldCacheMap = new HashMap<>();
        //获得对于class及父class所有的成员属性
        Utils.parserAllFieldToCache(fieldCacheMap, beanType);
        //获得需要序列化的成员
        fieldSerializers = Utils.computeGetters(beanType, fieldCacheMap);
    }

    /**
     * 序列化对象
     *
     * @param config JSON的配置器
     * @param out    输出结果
     * @param object 需要序列化的对象
     */
    @Override
    public void serializer(JsonConfig config, StringBuilder out, Object object) {
        out.append("{");
        //上个属性是否为空
        boolean lastEmpty = true;
        for (FieldSerializer fieldSerializer : fieldSerializers) {
            //如果当前属性为空，则返回""
            String serializer = fieldSerializer.serializer(config, object);
            //如果上个属性非空，并且当前属性非空，则先拼接','
            if (!lastEmpty && !serializer.isEmpty()) {
                out.append(",");
            }
            //如果上个属性非空，则下一个属性是否拼接','，与当前属性是否为空无关；如果上个属性为空，则下一个属性是否拼接','，与当前属性是否为空有关
            if (lastEmpty) {
                lastEmpty = serializer.isEmpty();
            }
            out.append(serializer);
        }
        out.append("}");
    }
}
